package com.b.sts.service.impl;

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON;
import com.b.sts.entity.LogEntity;
import com.b.sts.entity.ProductEntity;
import com.b.sts.mapper.ProductMapper;
import com.b.sts.service.LogService;
import com.b.sts.service.ProductService;
import com.b.sts.service.UserService;
import com.b.sts.util.JwtUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 商品表 服务实现类
 * </p>
 *
 * @author b
 * @since 2023-07-12
 */
@Service
public class ProductServiceImp extends ServiceImpl<ProductMapper, ProductEntity> implements ProductService {
    @Resource
    ProductMapper mapper; // ProductMapper对象，用于数据库操作
    @Resource
    UserService userService; // UserService对象，用于获取用户信息

    @Resource
    LogService logService;

    /**
     * 根据ID获取产品信息
     *
     * @param id 产品ID
     * @return 产品实体对象
     */
    @Override
    public ProductEntity get(Integer id) {
        ProductEntity entity = mapper.selectById(id); // 根据ID从数据库中查询产品信息
        entity.setViewCount(entity.getViewCount() + 1); // 浏览量+1
        update(entity); // 更新产品信息
        entity.setUserEntity(userService.get(entity.getSellerId())); // 获取卖家用户信息
        try {
            entity.setImageList(JSON.parseArray(entity.getImages(), String.class)); // 解析图片列表
        } catch (Exception ignored) {
        }
        return entity; // 返回产品实体对象
    }

    /**
     * 根据条件查询产品列表
     *
     * @param entity 查询条件
     * @return 产品实体对象列表
     */
    @Override
    public List<ProductEntity> list(ProductEntity entity) {
        String search = entity.getSearch(); // 获取搜索关键字
        LambdaQueryWrapper<ProductEntity> wrapper = new LambdaQueryWrapper<>(); // 创建查询条件包装器
        wrapper.setEntity(entity); // 设置查询条件
        if (StrUtil.isNotBlank(search)) {
            // 如果搜索关键字不为空，添加多个模糊查询条件
            wrapper.or().like(ProductEntity::getName, search).or()
                    .like(ProductEntity::getModel, search).or()
                    .like(ProductEntity::getDescription, search).or()
                    .like(ProductEntity::getPrice, search).or()
                    .like(ProductEntity::getType, search).or();
        }
        return mapper.selectList(wrapper).stream()
                .peek(e -> {
                    try {
                        e.setImageList(JSON.parseArray(e.getImages(), String.class)); // 解析图片列表
                    } catch (Exception ignored) {
                    }
                }).collect(Collectors.toList()); // 返回查询结果列表
    }

    /**
     * 添加产品
     *
     * @param entity 产品实体对象
     * @return 添加是否成功
     */
    @Override
    public boolean add(ProductEntity entity) {
        entity.setStatus("在售"); // 设置产品状态为在售
        entity.setFlow("审核中");
        boolean b = mapper.insert(entity) > 0;
        //添加日志
        LogEntity logEntity = new LogEntity();
        logEntity.setProductId(entity.getId());
        logEntity.setSeller(JwtUtil.getUser().getName());
        logEntity.setType("release");
        logService.add(logEntity);
        return b; // 执行插入操作并返回是否成功
    }

    /**
     * 根据ID删除产品
     *
     * @param id 产品ID
     * @return 删除是否成功
     */
    @Override
    public boolean del(Integer id) {
        return mapper.deleteById(id) > 0; // 执行删除操作并返回是否成功
    }

    /**
     * 更新产品信息
     *
     * @param entity 产品实体对象
     * @return 更新是否成功
     */
    @Override
    public boolean update(ProductEntity entity) {
        return mapper.updateById(entity) > 0; // 执行更新操作并返回是否成功
    }

    /**
     * 获取当前用户的产品列表
     *
     * @param entity 查询条件
     * @return 产品实体对象列表
     */
    @Override
    public List<ProductEntity> my(ProductEntity entity) {
        return list(entity); // 调用list方法获取产品列表
    }

    @Override
    public boolean confirmSales(ProductEntity entity, String buyer) {
        entity.setStatus("售空");
        boolean b = this.update(entity);
        if (b) {
            //添加日志
            LogEntity logEntity = new LogEntity();
            logEntity.setProductId(entity.getId());
            logEntity.setSeller(JwtUtil.getUser().getName());
            logEntity.setBuyer(buyer);
            logEntity.setType("transaction");
            logService.add(logEntity);
        }
        return b;
    }
}
